﻿using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;

using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Servico.Bovespa.Ordens.BusinessEntity;

namespace Sinacor.Servico.Bovespa.Ordens.ResourceAccess
{
    public class OrdemDigitacao : BaseResourceAccess
    {
        public OrdemDigitacao()
            : base(AuthorizationContext.Current.CompanyId)
        {

        }

        /// Data:28/07/2008
        /// Autor:Marcelo Barucci
        /// Obs:
        /// Recebe um  BusinessEntity.OrdemDigitacao e 
        /// realiza a inserção dos campos tabela TORDISTR
        public bool InserirDistribuicao(BusinessEntity.OrdemDigitacao pLoteDigitacao)
        {
            String retorno = null;
            
            
            //Recupera o Numero sequencial para o Lote
            //Int32 numeroLote = this.RecuperaProximaSequenciaDistribuicao(pLoteDigitacao);
            DbCommand dbCommand;
            StringBuilder sql = new StringBuilder();

            #region Monta Sql Query
            sql.Append("INSERT INTO TORDISTR ");
            sql.Append(" ( DT_DATORD,");
            sql.Append("NR_SEQORD, ");
            sql.Append("NR_SUBSEQ, ");
            sql.Append("NR_SEQDIS, ");
            sql.Append("DT_DATMOV, ");
            sql.Append("CD_CLIENTE,");
            sql.Append("DV_CLIENTE,");
            sql.Append("QT_CLIENTE,");
            sql.Append("PC_REDACR, ");
            sql.Append("CD_CARLIQ, ");
            sql.Append("CD_USUFIN, ");
            sql.Append("CD_CLIFIN, ");
            sql.Append("DV_CLIFIN, ");
            sql.Append("VL_NEGOCIO,");
            sql.Append("IN_LIQUIDA,");
            sql.Append("PC_DISTRIB,");
            sql.Append("VL_DOLAR,  ");
            sql.Append(" IN_DISTRIBUI,");
            sql.Append(" IN_EXTERNO,");
            sql.Append(" IN_FOP,");
            sql.Append(" DT_SISTEMA ) ");
            sql.Append(" VALUES ");
            sql.Append("( :P_DT_DATORD, ");
            sql.Append(" :P_NR_SEQORD,  ");
            sql.Append(" :P_NR_SUBSEQ,  ");
            sql.Append(" :P_NR_SEQDIS,  ");
            sql.Append(" :P_DT_DATMOV,  ");
            sql.Append(" :P_CD_CLIENTE, ");
            sql.Append(" :P_DV_CLIENTE, ");
            sql.Append(" :P_QT_CLIENTE, ");
            sql.Append(" :P_PC_REDACR,  ");
            sql.Append(" :P_CD_CARLIQ,  ");
            sql.Append(" :P_CD_USUFIN,  ");
            sql.Append(" :P_CD_CLIFIN,  ");
            sql.Append(" :P_DV_CLIFIN,  ");
            sql.Append(" :P_VL_NEGOCIO, ");
            sql.Append(" :P_IN_LIQUIDA, ");
            sql.Append(" :P_PC_DISTRIB, ");
            sql.Append(" :P_VL_DOLAR,   ");
            sql.Append(" :P_IN_DISTRIBUI,");
            sql.Append(" :P_IN_EXTERNO,");
            sql.Append(" :P_IN_FOP,");
            sql.Append(" :P_DT_SISTEMA ) ");
            #endregion Monta Sql Query

            dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString());
           
            #region Adiciona os parametros de acordo com os valores passados no objeto
                this.DataBase.AddInParameter(dbCommand, ":P_DT_DATORD", DbType.DateTime, pLoteDigitacao.DataOrdem);
                this.DataBase.AddInParameter(dbCommand, ":P_NR_SEQORD", DbType.Int32, pLoteDigitacao.NumeroOrdem);
                this.DataBase.AddInParameter(dbCommand, ":P_NR_SUBSEQ", DbType.Int32, pLoteDigitacao.NumeroOrdemSubSequencia);
                this.DataBase.AddInParameter(dbCommand, ":P_NR_SEQDIS", DbType.Int32, this.RecuperaProximaSequenciaDistribuicao(pLoteDigitacao));
                this.DataBase.AddInParameter(dbCommand, ":P_DT_DATMOV", DbType.Date, pLoteDigitacao.DataMovimento);
                this.DataBase.AddInParameter(dbCommand, ":P_CD_CLIENTE", DbType.Int32, pLoteDigitacao.CodigoCliente);
                this.DataBase.AddInParameter(dbCommand, ":P_DV_CLIENTE", DbType.Int32, pLoteDigitacao.DigitoVerificadorCliente); // alterado é digito cliente	
                this.DataBase.AddInParameter(dbCommand, ":P_QT_CLIENTE", DbType.Decimal, pLoteDigitacao.QuantidadeDestinadaCliente);
                this.DataBase.AddInParameter(dbCommand, ":P_PC_REDACR", DbType.Decimal, pLoteDigitacao.PercentualAcrescimo); 
                this.DataBase.AddInParameter(dbCommand, ":P_CD_CARLIQ", DbType.Int32, pLoteDigitacao.CodigoCarteira);
                this.DataBase.AddInParameter(dbCommand, ":P_CD_USUFIN", DbType.String, pLoteDigitacao.CodigoAgenteCustodia);//CERTO
                this.DataBase.AddInParameter(dbCommand, ":P_CD_CLIFIN", DbType.Int32, pLoteDigitacao.CodigoClienteCustodia);
                this.DataBase.AddInParameter(dbCommand, ":P_DV_CLIFIN", DbType.Int16, pLoteDigitacao.DigitoClienteCustodia);
                this.DataBase.AddInParameter(dbCommand, ":P_VL_NEGOCIO", DbType.Decimal, pLoteDigitacao.PrecoInformado);
                  
                this.DataBase.AddInParameter(dbCommand, ":P_IN_LIQUIDA", DbType.String, Sinacor.Servico.Bovespa.BovespaBase.Util.Funcoes.ToUpper(Sinacor.Infra.Service.Common.EnumConverter.ToString<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Enum.TipoLiquidacaoDistribuicao?>(pLoteDigitacao.TipoLiquidacao)));
                this.DataBase.AddInParameter(dbCommand, ":P_PC_DISTRIB", DbType.Decimal, pLoteDigitacao.PercentualDistribuido);
                this.DataBase.AddInParameter(dbCommand, ":P_VL_DOLAR", DbType.Decimal, pLoteDigitacao.ValorDolar); // errado
                this.DataBase.AddInParameter(dbCommand, ":P_IN_DISTRIBUI", DbType.String, (pLoteDigitacao.TipoOrdemDistribuicao == BusinessEntity.Enum.TipoOrdemDistribuicao.AdministradoConcorrente) ? "A": "N" ); //Implementar regra a ser enviado pelo arquiteto não definida na TASK 577	
                this.DataBase.AddInParameter(dbCommand, ":P_IN_EXTERNO", DbType.String, pLoteDigitacao.IndicadorSistemaExterno);
                this.DataBase.AddInParameter(dbCommand, ":P_IN_FOP", DbType.String, pLoteDigitacao.IndicadorNaoLiquidacao); //Regra não descrita na TASK 577	
                this.DataBase.AddInParameter(dbCommand, ":P_DT_SISTEMA", DbType.Date, DateTime.Now);	

      
            #endregion Adiciona os parametros de acordo com os valores passados no objeto

            // dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString());
            this.DataBase.ExecuteScalar(dbCommand);
               // this.DataBase.ExecuteNonQuery(dbCommand);

          
                    return true;
        }


     


        /* Testar para ver se a execução de àckages funciona usando esse formato*/
        public void ExecutarDistribuicaoPOP(BusinessEntity.OrdemDigitacao pLoteDigitacao)
        {
           Object[] objcts = new Object[1];
           try
           {
               DbCommand dbCommand = this.DataBase.GetStoredProcCommand("PR_DISCRI.PR_DISTRI");

               this.DataBase.AddInParameter(dbCommand, "P_DATMOV", DbType.String, Sinacor.Servico.Bovespa.BovespaBase.Util.Funcoes.FormatarData(pLoteDigitacao.DataOrdem, "/"));
               this.DataBase.AddInParameter(dbCommand, "P_DATORD", DbType.String, Sinacor.Servico.Bovespa.BovespaBase.Util.Funcoes.FormatarData(pLoteDigitacao.DataOrdem, "/"));
               this.DataBase.AddInParameter(dbCommand, "P_SEQORD", DbType.Int32, pLoteDigitacao.NumeroOrdem);
               this.DataBase.AddInParameter(dbCommand, "P_SUBSEQ", DbType.Int32, pLoteDigitacao.NumeroOrdemSubSequencia);
               this.DataBase.AddInParameter(dbCommand, "P_TIPO", DbType.String, Sinacor.Servico.Bovespa.BovespaBase.Util.Funcoes.ToUpper(Sinacor.Infra.Service.Common.EnumConverter.ToString<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Enum.TipoDistribuicao?>(pLoteDigitacao.TipoDistribuicao)));

               this.DataBase.ExecuteNonQuery(dbCommand);
           }
           // ACERTADO COM TODOS POIS É A UNICA SOLUÇÃO POSSÍVEL , POIS O ERRO QUE VEM É DO ORACLE IRÁ SER ACERTADO NA PROXIMA INTERAÇÃO
           catch (System.Data.OracleClient.OracleException oraException)
           {
               objcts[0] = oraException.Message;
               throw new BusinessException(109006, objcts);

           }
        }

        /* Testar para ver se a execução de àckages funciona usando esse formato*/
        public void ExecutarDistribuicaoAdministradoConcorrente(BusinessEntity.OrdemDigitacao pLoteDigitacao)
        {
            Object[] objcts = new Object[1];
            try
            {
                DbCommand dbCommand = this.DataBase.GetStoredProcCommand("pOr_Dist_AdmCon.PR_DISTRI");

                this.DataBase.AddInParameter(dbCommand, "P_DATMOV", DbType.String, Sinacor.Servico.Bovespa.BovespaBase.Util.Funcoes.FormatarData(pLoteDigitacao.DataMovimento, "/"));
                this.DataBase.AddInParameter(dbCommand, "P_DATORD", DbType.String, Sinacor.Servico.Bovespa.BovespaBase.Util.Funcoes.FormatarData(pLoteDigitacao.DataOrdem, "/"));
                this.DataBase.AddInParameter(dbCommand, "P_SEQORD", DbType.Int32, pLoteDigitacao.NumeroOrdem);
                this.DataBase.AddInParameter(dbCommand, "P_SUBSEQ", DbType.Int32, pLoteDigitacao.NumeroOrdemSubSequencia);
                this.DataBase.AddInParameter(dbCommand, "P_TIPO", DbType.String, Sinacor.Servico.Bovespa.BovespaBase.Util.Funcoes.ToUpper(Sinacor.Infra.Service.Common.EnumConverter.ToString<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Enum.TipoDistribuicao?>(pLoteDigitacao.TipoDistribuicao)));
                this.DataBase.AddInParameter(dbCommand, "P_NUSUARIO", DbType.Int32, AuthorizationContext.Current.UserId); //Qual Parametro usar???
                this.DataBase.ExecuteNonQuery(dbCommand);
            }
            // ACERTADO COM TODOS POIS É A UNICA SOLUÇÃO POSSÍVEL , POIS O ERRO QUE VEM É DO ORACLE IRÁ SER ACERTADO NA PROXIMA INTERAÇÃO
            catch (System.Data.OracleClient.OracleException oraException)
            {
                objcts[0] = oraException.Message;
                throw new BusinessException(109006, objcts);

            }
        }


        #region Métodos auxiliares da classe
        /// <summary>
        /// Data:11/07/2008
        /// Autor:Marcelo Barucci
        /// Obs:
        /// Método utilizado para recuperar o numero da Sequencia.
        /// </summary>
        /// <returns>Int32 Número do Lote</returns>
        private Int32 RecuperaProximaSequenciaDistribuicao(
            Sinacor.Servico.Bovespa.Ordens.BusinessEntity.OrdemDigitacao pLoteDigitacao
        )
        {
           
            DbCommand dbCommand;
            StringBuilder sql = new StringBuilder();

            sql.Append("Select MAX ( NR_SEQDIS ) + 1 ");
            sql.Append("From TORDISTR ");
            sql.Append("Where DT_DATORD = ");
            sql.Append(":pDataOrdem");
            sql.Append(" and NR_SEQORD = ");
            sql.Append(":pNrSeqord");
            sql.Append(" and NR_SUBSEQ = ");
            sql.Append(":pNrOrdemSubSequencia");
            dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString());
            this.DataBase.AddInParameter(dbCommand, ":pNrSeqord", DbType.Int32, pLoteDigitacao.NumeroOrdem);
            this.DataBase.AddInParameter(dbCommand, ":pNrOrdemSubSequencia", DbType.Int32, pLoteDigitacao.NumeroOrdemSubSequencia );
            this.DataBase.AddInParameter(dbCommand, ":pDataOrdem", DbType.Date, pLoteDigitacao.DataOrdem);

           
            string result = this.DataBase.ExecuteScalar(dbCommand).ToString();
            if (result.Trim().Length == 0)
                return 1;
            else
                return Convert.ToInt32(result);
        }
        #endregion Métodos auxiliares da classe


        /// <summary>
        /// ConsultarOrdemDigitacao
        /// Data: 06/09/2008
        /// Autor: Leandro Liez
        /// Obs: Criação do Método
        /// </summary>
        /// <param name="pConsultarOrdemDigitacao"></param>
        /// <returns></returns>
        public List<BusinessEntity.OrdemDigitacao> ConsultarOrdemDigitacao(BusinessEntity.Parameter.ConsultarOrdemDigitacao pConsultarOrdemDigitacao)
        {

            List<BusinessEntity.OrdemDigitacao> response = new List<BusinessEntity.OrdemDigitacao>();
            OracleDataBase dbDataBase = this.DataBase;//new OracleDataBase(SessionData.GetCompanyID());

            StringBuilder sql = new StringBuilder();
            sql.AppendLine("select A.DT_DATORD \"DataOrdem\", ");
            sql.AppendLine("A.NR_SEQORD \"NumeroOrdem\", ");
            sql.AppendLine("A.NR_SUBSEQ \"NumeroOrdemSubSequencia\", ");
            sql.AppendLine("A.NR_SEQDIS \"NumeroSequenciaDigitacao\", ");
            sql.AppendLine("A.CD_CLIENTE \"CodigoCliente\", ");
            sql.AppendLine("B.IN_SITUAC \"SituacaoCliente\", ");
            sql.AppendLine("A.VL_NEGOCIO \"PrecoInformado\", ");
            sql.AppendLine("A.QT_CLIENTE \"QuantidadeDestinadaCliente\", ");
            sql.AppendLine("A.CD_USUFIN \"CodigoAgenteCustodia\", ");
            sql.AppendLine("A.CD_CLIFIN \"CodigoClienteCustodia\", ");
            sql.AppendLine("A.DV_CLIFIN \"DigitoClienteCustodia\", ");
            sql.AppendLine("A.CD_CARLIQ \"CodigoCarteira\", ");
            sql.AppendLine("A.PC_REDACR \"PercentualAcrescimo\", ");
            sql.AppendLine("A.DT_DATMOV \"DataMovimento\", ");
            sql.AppendLine("A.DV_CLIENTE \"DigitoVerificadorCliente\", ");
            sql.AppendLine("A.IN_LIQUIDA \"TipoLiquidacao\", ");
            sql.AppendLine("A.IN_DISTRIBUI \"ControleTipoDistribuicao\", ");
            sql.AppendLine("B.CD_OPERAC_CVM \"CodigoOperadorCVM\", ");
            sql.AppendLine("b.nm_apelido \"ApelidoCliente\", ");
            sql.AppendLine("A.VL_DOLAR \"ValorDolar\", ");
            sql.AppendLine("c.nm_cliente||' '||b.nm_compl_nome \"NomeCompleto\",");
            sql.AppendLine("A.IN_EXTERNO  IndicadorSistemaExterno ,");
            sql.AppendLine("a.PC_DISTRIB \"PercentualDistribuido\" , ");
            sql.AppendLine("a.IN_FOP  IndicadorNaoLiquidacao");
            sql.AppendLine("FROM TORDISTR A, TSCCLIBOL B, tsccliger c ");
            sql.AppendLine("where A.nr_seqord    = :NumeroOrdem ");
            sql.AppendLine("AND A.nr_subseq    = :NumeroOrdemSubSequencia ");
            sql.AppendLine("and A.dt_datmov    = :DataMovimento ");
            sql.AppendLine("AND A.CD_CLIENTE   = B.CD_CLIENTE ");
            sql.AppendLine("and b.cd_cpfcgc    = c.cd_cpfcgc ");
            sql.AppendLine("and b.dt_nasc_fund = c.dt_nasc_fund ");
            sql.AppendLine("and b.cd_con_dep   = c.cd_con_dep ");
            sql.AppendLine("order by NR_SEQDIS ");

            DbCommand dbCommand = dbDataBase.GetSqlStringCommand(sql.ToString());

            dbDataBase.AddInParameter(dbCommand, "NumeroOrdem", DbType.Int64, pConsultarOrdemDigitacao.NumeroOrdem);
            dbDataBase.AddInParameter(dbCommand, "DataMovimento", DbType.DateTime, pConsultarOrdemDigitacao.DataMovimento);
            dbDataBase.AddInParameter(dbCommand, "NumeroOrdemSubSequencia", DbType.Int64, pConsultarOrdemDigitacao.NumeroOrdemSubSequencia);


            IDataReader dataReader = dbDataBase.ExecuteReader(dbCommand);

            while (dataReader.Read())
            {
                //adiciona o item de response
                BusinessEntity.OrdemDigitacao ordemDigitacao = new BusinessEntity.OrdemDigitacao();

                ordemDigitacao.DataOrdem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDateTime(dataReader["DataOrdem"]);
                ordemDigitacao.NumeroOrdem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["NumeroOrdem"]);
                ordemDigitacao.NumeroOrdemSubSequencia = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["NumeroOrdemSubSequencia"]);
                ordemDigitacao.NumeroSequenciaDigitacao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt64(dataReader["NumeroSequenciaDigitacao"]);
                ordemDigitacao.CodigoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["CodigoCliente"]);
                ordemDigitacao.SituacaoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["SituacaoCliente"]);
                if (dataReader["PrecoInformado"].ToString() != "" )
                    ordemDigitacao.PrecoInformado = 
                        Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["PrecoInformado"]);
                if (dataReader["QuantidadeDestinadaCliente"].ToString() != "") 
                    ordemDigitacao.QuantidadeDestinadaCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["QuantidadeDestinadaCliente"]);
                ordemDigitacao.CodigoClienteCustodia = dataReader.GetValue<Int32?>("CodigoClienteCustodia");
                ordemDigitacao.CodigoAgenteCustodia = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["CodigoAgenteCustodia"]);
                ordemDigitacao.DigitoClienteCustodia = dataReader.GetValue<Int32?>("DigitoClienteCustodia");
                ordemDigitacao.CodigoCarteira = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["CodigoCarteira"]);
                if(dataReader["PercentualAcrescimo"].ToString() != "")
                    ordemDigitacao.PercentualAcrescimo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["PercentualAcrescimo"]);
                ordemDigitacao.DataMovimento = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDateTime(dataReader["DataMovimento"]);
                ordemDigitacao.DigitoVerificadorCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["DigitoVerificadorCliente"]);
                ordemDigitacao.TipoLiquidacao = (BusinessEntity.Enum.TipoLiquidacaoDistribuicao?)Sinacor.Infra.Service.Common.EnumConverter.Parse<BusinessEntity.Enum.TipoLiquidacaoDistribuicao>
                                                        (Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["TipoLiquidacao"])); 
                ordemDigitacao.ControleTipoDistribuicao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["ControleTipoDistribuicao"]);
                ordemDigitacao.CodigoOperadorCVM = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["CodigoOperadorCVM"]);
                ordemDigitacao.ApelidoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["ApelidoCliente"]);
                if (dataReader["ValorDolar"]!= System.DBNull.Value)
                    ordemDigitacao.ValorDolar = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["ValorDolar"]);
                ordemDigitacao.NomeClienteCompleto = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["NomeCompleto"]);
                ordemDigitacao.IndicadorSistemaExterno =dataReader["IndicadorSistemaExterno"].ToString();
                ordemDigitacao.IndicadorNaoLiquidacao = dataReader["IndicadorNaoLiquidacao"].ToString();
                ordemDigitacao.PercentualDistribuido = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["PercentualDistribuido"]);

                response.Add(ordemDigitacao);

            }

            dataReader.Close();
            return response;
        }



        /// <summary>
        /// ConsultarOrdemDigitacaoLote
        /// Data: 18/12/2008
        /// Autor: Apsilva
        /// Obs: Criação do Método para listar os dados das ordem para o lote informado
        /// </summary>
        /// <param name="pConsultarOrdemDigitacao"></param>
        /// <returns></returns>
        public List<BusinessEntity.OrdemDigitacao> ConsultarOrdemDigitacaoLote(BusinessEntity.Parameter.ConsultarOrdemDistribuicaoOrdemLote prequest)
        {

            List<BusinessEntity.OrdemDigitacao> response = new List<BusinessEntity.OrdemDigitacao>();
            OracleDataBase dbDataBase = this.DataBase;//new OracleDataBase(SessionData.GetCompanyID());

            StringBuilder sql = new StringBuilder();
            sql.AppendLine("select  A.NR_CONJUNTO \"NumeroLote\", ");
            sql.AppendLine("A.NR_SEQDIS \"NumeroSequenciaDigitacao\", ");
            sql.AppendLine("A.CD_CLIENTE \"CodigoCliente\",");
            sql.AppendLine("B.IN_SITUAC \"SituacaoCliente\",");
            sql.AppendLine("A.VL_NEGOCIO \"PrecoInformado\",");
            sql.AppendLine("A.QT_CLIENTE \"QuantidadeDestinadaCliente\", ");
            sql.AppendLine("A.CD_USUFIN \"CodigoAgenteCustodia\", ");
            sql.AppendLine("A.CD_CLIFIN \"CodigoClienteCustodia\", ");
            sql.AppendLine("A.DV_CLIFIN \"DigitoClienteCustodia\", ");
            sql.AppendLine("A.CD_CARLIQ \"CodigoCarteira\", ");
            sql.AppendLine("A.PC_REDACR \"PercentualAcrescimo\", ");
            sql.AppendLine("A.DT_DATMOV \"DataMovimento\", ");
            sql.AppendLine("A.DV_CLIENTE \"DigitoVerificadorCliente\", ");
            sql.AppendLine("A.IN_LIQUIDA \"TipoLiquidacao\", ");
            sql.AppendLine("'S'  \"ControleTipoDistribuicao\", ");
            sql.AppendLine("B.CD_OPERAC_CVM \"CodigoOperadorCVM\", ");
            sql.AppendLine("b.nm_apelido \"ApelidoCliente\", ");
            sql.AppendLine("A.VL_DOLAR \"ValorDolar\", ");
            sql.AppendLine("c.nm_cliente||' '||b.nm_compl_nome \"NomeCompleto\",");
            sql.AppendLine("A.IN_EXTERNO  IndicadorSistemaExterno ,");
            sql.AppendLine("a.IN_FOP  IndicadorNaoLiquidacao,");
            sql.AppendLine("a.PC_DISTRIB \"PercentualDistribuido\" ");
            sql.AppendLine("FROM TORDISORD A, TSCCLIBOL B, tsccliger c ");
            sql.AppendLine("where A.nr_conjunto  = :NumeroLote ");
            sql.AppendLine("AND A.dt_datmov    = :DataMovimento ");
            sql.AppendLine("and A.CD_CLIENTE   = B.CD_CLIENTE  ");
            sql.AppendLine("and b.cd_cpfcgc    = c.cd_cpfcgc ");
            sql.AppendLine("and b.dt_nasc_fund = c.dt_nasc_fund ");
            sql.AppendLine("and b.cd_con_dep   = c.cd_con_dep ");
            sql.AppendLine("order by NR_SEQDIS ");

            DbCommand dbCommand = dbDataBase.GetSqlStringCommand(sql.ToString());

            dbDataBase.AddInParameter(dbCommand, "NumeroLote", DbType.Int64, prequest.NumeroConjunto);
            dbDataBase.AddInParameter(dbCommand, "DataMovimento", DbType.DateTime, prequest.DataMovimento);

            IDataReader dataReader = dbDataBase.ExecuteReader(dbCommand);

            while (dataReader.Read())
            {
                //adiciona o item de response
                BusinessEntity.OrdemDigitacao ordemDigitacao = new BusinessEntity.OrdemDigitacao();

                //ordemDigitacao.DataOrdem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDateTime(dataReader["DataOrdem"]);
//                ordemDigitacao.NumeroOrdem = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["NumeroOrdem"]);
  //              ordemDigitacao.NumeroOrdemSubSequencia = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["NumeroOrdemSubSequencia"]);
                ordemDigitacao.NumeroSequenciaDigitacao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt64(dataReader["NumeroSequenciaDigitacao"]);
                ordemDigitacao.CodigoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["CodigoCliente"]);
                ordemDigitacao.SituacaoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["SituacaoCliente"]);
                if (dataReader["PrecoInformado"].ToString() != "")
                    ordemDigitacao.PrecoInformado =
                        Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["PrecoInformado"]);
                if (dataReader["QuantidadeDestinadaCliente"].ToString() != "")
                    ordemDigitacao.QuantidadeDestinadaCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["QuantidadeDestinadaCliente"]);
                ordemDigitacao.CodigoClienteCustodia =  dataReader.GetValue<Int32?>("CodigoClienteCustodia");
                ordemDigitacao.CodigoAgenteCustodia = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["CodigoAgenteCustodia"]);
                ordemDigitacao.DigitoClienteCustodia = dataReader.GetValue<Int32?>("DigitoClienteCustodia");
                ordemDigitacao.CodigoCarteira = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["CodigoCarteira"]);
                if (dataReader["PercentualAcrescimo"].ToString() != "")
                    ordemDigitacao.PercentualAcrescimo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["PercentualAcrescimo"]);
                ordemDigitacao.DataMovimento = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDateTime(dataReader["DataMovimento"]);
                ordemDigitacao.DigitoVerificadorCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(dataReader["DigitoVerificadorCliente"]);
                ordemDigitacao.TipoLiquidacao = (BusinessEntity.Enum.TipoLiquidacaoDistribuicao?)Sinacor.Infra.Service.Common.EnumConverter.Parse<BusinessEntity.Enum.TipoLiquidacaoDistribuicao>
                                                        (Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["TipoLiquidacao"]));
                ordemDigitacao.ControleTipoDistribuicao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["ControleTipoDistribuicao"]);
                ordemDigitacao.CodigoOperadorCVM = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["CodigoOperadorCVM"]);
                ordemDigitacao.ApelidoCliente = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["ApelidoCliente"]);
                if (dataReader["ValorDolar"] != System.DBNull.Value)
                    ordemDigitacao.ValorDolar = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal(dataReader["ValorDolar"]);
                ordemDigitacao.NomeClienteCompleto = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(dataReader["NomeCompleto"]);
                ordemDigitacao.IndicadorSistemaExterno = dataReader["IndicadorSistemaExterno"].ToString();
                ordemDigitacao.IndicadorNaoLiquidacao = dataReader["IndicadorNaoLiquidacao"].ToString();
                ordemDigitacao.PercentualDistribuido =Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorDecimal( dataReader["PercentualDistribuido"]);
                
                response.Add(ordemDigitacao);

            }

            dataReader.Close();
            return response;
        }


        // WAbreu.7COMm
        // TASK 1288
        // 2008-08-20 16:25
        public void ExcluirPOP(BusinessEntity.Parameter.ExcluirOrdemDigitacao pExcluir)
        {
            DbCommand dbCommand = this.DataBase.GetSqlStringCommand (
                @"DELETE FROM TORDISTR
                  WHERE DT_DATORD = :DataOrdem
                  AND   NR_SEQORD = :NumeroOrdem
                  AND   NR_SUBSEQ = :NumeroOrdemSubSequencia
                  AND   NR_SEQDIS = :NumeroSequenciaDistribuicao"
            );

            this.DataBase.AddInParameter(dbCommand, "DataOrdem", DbType.Date, pExcluir.DataOrdem);
            this.DataBase.AddInParameter(dbCommand, "NumeroOrdem", DbType.Int32, pExcluir.NumeroOrdem);
            this.DataBase.AddInParameter(dbCommand, "NumeroOrdemSubSequencia", DbType.Int32, pExcluir.NumeroOrdemSubSequencia);
            this.DataBase.AddInParameter(dbCommand, "NumeroSequenciaDistribuicao", DbType.Int32, pExcluir.NumeroOrdemSequenciaDistribuicao);
            this.DataBase.ExecuteNonQuery(dbCommand);
        }

        // WAbreu.7COMm
        // TASK 1288
        // 2008-08-20 16:25
        public void ExcluirAdministradoConcorrente(BusinessEntity.Parameter.ExcluirOrdemDigitacao pExcluir)
        {
            DbCommand dbCommand = this.DataBase.GetSqlStringCommand(
                @"DELETE FROM TORDISTR
                  WHERE DT_DATORD = :DataOrdem
                  AND   NR_SEQORD = :NumeroOrdem
                  AND   NR_SUBSEQ = :NumeroOrdemSubSequencia
                  AND   NR_SEQDIS = :NumeroSequenciaDistribuicao"
            );

            this.DataBase.AddInParameter(dbCommand, "DataOrdem", DbType.Date, pExcluir.DataOrdem);
            this.DataBase.AddInParameter(dbCommand, "NumeroOrdem", DbType.Int32, pExcluir.NumeroOrdem);
            this.DataBase.AddInParameter(dbCommand, "NumeroOrdemSubSequencia", DbType.Int32, pExcluir.NumeroOrdemSubSequencia);
            this.DataBase.AddInParameter(dbCommand, "NumeroSequenciaDistribuicao", DbType.Int32, pExcluir.NumeroOrdemSequenciaDistribuicao);
            this.DataBase.ExecuteNonQuery(dbCommand);
        }
    }
}
